/* 
    首先我们要介绍的是combineLatest，它会取得各个observable 最后送出的值，
    再输出成一个值，我们直接看范例会比较好解释。
*/


const source = Rx.Observable.interval(500).take(3);
const newest = Rx.Observable.interval(300).take(6);

const example = source.combineLatest(newest, (x, y) => x + y);

example.subscribe({
    next: (value) => { console.log(value); },
    error: (err) => { console.log('Error: ' + err); },
    complete: () => { console.log('complete'); }
});

// 0
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// complete 

/*  
    大家第一次看到这个output 应该都会很困惑，我们直接来看Marble Diagram 吧！
    source : ----0----1----2|
    newest : --0--1--2--3--4--5|

    combineLatest(newest, (x, y) => x + y);

    example: ----01--23-4--(56)--7|
*/

/* 
    首先 combineLatest 可以接收多个observable, 最后一个参数是callback function，这个callback function 接收的参数数量跟合并的observable 数量相同
    我们这里合并了两个observable 所以后面的callback function 就接收x, y 两个参数，x 会接收从source 
    发送出来的值，y 会接收从newest 发送出来的值。
    最后一个重点就是一定会等两个observable 都曾有送值出来才会呼叫我们传入的callback，所以这段程式是这样运行的
*/